/**
 *
 */
package ar.com.mun.rowProcessors;

import ar.com.mun.beans.Expediente;
import ar.com.mun.beans.Motivo;
import ar.com.mun.beans.Municipalidad;
import ar.com.mun.daos.ExpedienteDAO;
import ar.com.mun.daos.MotivoDAO;
import ar.com.mun.daos.MunicipalidadDAO;

import com.angel.common.helpers.StringHelper;
import com.angel.data.generator.annotations.Inject;
import com.angel.io.annotations.ColumnRow;
import com.angel.io.annotations.RowChecker;
import com.angel.io.annotations.RowProcessor;
import com.angel.io.annotations.RowProcessorCommand;
import com.angel.io.exceptions.InvalidRowDataException;

/**
 * @author William
 *
 */
@RowProcessorCommand
	(
		columnsRow = {
			@ColumnRow( columnName = ExpedienteAnnotationRowProcessorCommand.NOMBRE_MUNICIPALIDAD_COLUMN, aliases = {"Nombre de la Municipalidad"} ),
			@ColumnRow( columnName = ExpedienteAnnotationRowProcessorCommand.NUMERO_COLUMN, aliases = {"Numero del expediente"} ),
			@ColumnRow( columnName = ExpedienteAnnotationRowProcessorCommand.CREADOR_COLUMN, aliases = {"Creador del Expediente"} ),
			@ColumnRow( columnName = ExpedienteAnnotationRowProcessorCommand.NOMBRE_MOTIVO_COLUMN, aliases = {"Nombre del Motivo"} ),
			@ColumnRow( columnName = ExpedienteAnnotationRowProcessorCommand.ALCANCE_COLUMN, aliases = {"Alcance"}, type = Integer.class )
		}
	)
public class ExpedienteAnnotationRowProcessorCommand {

	public static final String NOMBRE_MUNICIPALIDAD_COLUMN = "municipalidad";
	public static final String NUMERO_COLUMN = "numero";
	public static final String CREADOR_COLUMN = "creador";
	public static final String NOMBRE_MOTIVO_COLUMN = "nombreMotivo";
	public static final String ALCANCE_COLUMN = "alcance";

	@Inject
	private ExpedienteDAO expedienteDAO;
	@Inject
	private MunicipalidadDAO municipalidadDAO;
	@Inject
	private MotivoDAO motivoDAO;

    @RowChecker(columnsParameters = {})
    public void checkRowData(String nombreMunicipalidad, String numero, String nombreCreador, String nombreMotivo, Integer alcance) throws InvalidRowDataException {
		boolean areAllNotEmpty = StringHelper.areAllNotEmpty(nombreMunicipalidad, numero, nombreCreador, nombreMotivo, alcance.toString());
		if(!areAllNotEmpty){
			throw new InvalidRowDataException("Some row data are NULL - " +
					"nombreMunicipalidad: [" + nombreMunicipalidad + "] - " +
					"numero: [" + numero + "] - " +
					"nombreCreador: [" + nombreCreador + "] - " +
					"nombreMotivo: [" + nombreMotivo + "] - " +
					"alcance: [" + alcance + "].");
		}
		Expediente expediente = this.getExpedienteDAO().buscarUnicoOrNuloPorNumero(numero);
		if(expediente != null){
			throw new InvalidRowDataException("Expediente exist with name [" + expediente + "].");
		}
		
		Municipalidad municipalidad = this.getMunicipalidadDAO().buscarUnicoOrNuloPorNombre(nombreMunicipalidad);
		if(municipalidad == null){
			throw new InvalidRowDataException("Municipalidad doesn't exist with name [" + nombreMunicipalidad + "].");
		}
		
		Motivo motivo = this.getMotivoDAO().buscarUnicoOrNuloPorNombre(nombreMotivo);
		if(motivo == null){
			throw new InvalidRowDataException("Motivo doesn't exist with name [" + nombreMotivo + "].");
		}
    }

	@RowProcessor(columnsParameters = {}, object = Expediente.class, inject = true)
	public Expediente processRow(Expediente expediente, String nombreMunicipalidad, String numero, String nombreCreador, String nombreMotivo, Integer alcance) {
		Motivo motivo = this.getMotivoDAO().buscarUnicoOrNuloPorNombre(nombreMotivo);
		expediente.setMotivo(motivo);
		Municipalidad municipalidad = this.getMunicipalidadDAO().buscarUnicoOrNuloPorNombre(nombreMunicipalidad);
		expediente.setMunicipalidad(municipalidad);
        return expediente;
    }

	/**
	 * @return the expedienteDAO
	 */
	public ExpedienteDAO getExpedienteDAO() {
		return expedienteDAO;
	}

	/**
	 * @param expedienteDAO the expedienteDAO to set
	 */
	public void setExpedienteDAO(ExpedienteDAO expedienteDAO) {
		this.expedienteDAO = expedienteDAO;
	}

	/**
	 * @return the municipalidadDAO
	 */
	public MunicipalidadDAO getMunicipalidadDAO() {
		return municipalidadDAO;
	}

	/**
	 * @param municipalidadDAO the municipalidadDAO to set
	 */
	public void setMunicipalidadDAO(MunicipalidadDAO municipalidadDAO) {
		this.municipalidadDAO = municipalidadDAO;
	}

	/**
	 * @return the motivoDAO
	 */
	public MotivoDAO getMotivoDAO() {
		return motivoDAO;
	}

	/**
	 * @param motivoDAO the motivoDAO to set
	 */
	public void setMotivoDAO(MotivoDAO motivoDAO) {
		this.motivoDAO = motivoDAO;
	}
}
